Computing systems obtain a high degree of functionality by executing software programs. Computing systems use storage hierarchies in order to store such software programs and other files. At the lowest level of a local storage hierarchy might be a disk, such as a mechanical disk, optical disk and the like. Higher up in the storage hierarchy might be devices such as solid-state disks or non-volatile memory and the like.
Computing systems operate most efficiently when the most in demand blocks of data are located high in the storage hierarchy, wherein the lesser demanded blocks of data might be located lower in the storage hierarchy. The decision on where to place blocks of data within the storage hierarchy conventionally takes place below the file system.
The file system itself typically has no visibility on this storage hierarchy, but instead views storage in the form of a volume. A volume is a single logical namespace visible to the file system. A volume may be provisioned to be a certain size and often corresponds to the boundaries of an underlying storage device. For instance, a disk may be a single volume, or perhaps be partitioned into multiple volumes. Furthermore, a volume may be made up of multiple disks. The file system may then structure directories within the volume, and save files into the namespace, either at the root directory of the namespace, or within one of the directories of the namespaces.
A single volume may have particular traits. For instance, a volume might be set up to be mirrored and thus have a certain level of built-in redundancy. A volume might also be set up to be encrypted or compressed. Conventionally, the traits are set up on a per-volume basis. Thus, the file system itself views any block of storage within that volume to have the same traits as any other block of storage within that volume, and relegates any decisions regarding how blocks are placed to the storage system that is abstracted from the file system view.